package com.gopay.commons.validator.check;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.gopay.commons.validator.form.Field;
import com.gopay.commons.validator.form.Validator;

/**
 * 字符长度校验
 * 
 * @DefaultValueLengthValidator.java
 * @author yaobo
 * @2012-12-26 上午09:56:03 www.gopay.com.cn Inc.All rights reserved.
 */
public class DefaultValueLengthValidator extends DefaultValidator {

    @Override
    protected boolean validator(Field field) {
        List<Validator> validators = field.getValidators();
        Validator validator = null;

        for (Iterator<Validator> it = validators.iterator(); it.hasNext();) {
            validator = (Validator) it.next();
            String value = (String) field.getValue();
            if (!validatorMinAndMax(validator.getMinValue(), validator.getMaxValue(), value)) {
                return false;
            }
        }
        return true;
    }

    public boolean validatorMinAndMax(String min, String max, String value) {
        if (StringUtils.isBlank(min) && StringUtils.isBlank(max)) {
            return true;
        }

        if (StringUtils.isNotBlank(min)) {
            int intMin = Integer.parseInt(min);
            if (!validatorMin(intMin, value)) {
                return false;
            }
        }

        if (StringUtils.isNotBlank(max)) {
            int intMax = Integer.parseInt(max);
            if (!validatorMax(intMax, value)) {
                return false;
            }
        }

        return true;
    }

    private boolean validatorMin(int min, String value) {
        if (StringUtils.isBlank(value)) {
            return true;
        }

        int intValue = Integer.parseInt(value);
        if (intValue < min) {
            return false;
        }

        return true;
    }

    private boolean validatorMax(int max, String value) {
        if (StringUtils.isBlank(value)) {
            return true;
        }

        int intValue = Integer.parseInt(value);
        if (intValue > max) {
            return false;
        }
        return true;
    }
}
